﻿package com.zouloux.core.data 
{
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class ENum implements IENum
	{
		/**
		 * La valeur de cet ENUM
		 */
		protected var _value:String = "";
		
		/**
		 * La valeur
		 */
		public function get value ():String
		{
			return _value;
		}
		
		/**
		 * Le constructeur
		 * @param	pValue : La valeur
		 */
		public function ENum (pValue:String, pCheck:Boolean = false)
		{
			// Enregistrer la valeur
			_value = pValue;
			
			// Vérifier
			if (pCheck && !isValid())
				throw new Error("Invalid Enum Type");
		}
		
		/**
		 * Vérifier la validité de cet ENUM. Attention, le nom des constantes et leurs valeurs doivent suivre une nommenclature:
		 * OK:
		 * MOUSE_OUT = "mouse out";
		 * MOUSEOUT = "mouseOut";
		 * MOUSE_OUT = "MOUSE OUT";
		 * 
		 * NON OK:
		 * MOUSE_OUT = "MouseOut";
		 * MOUSE_OUT = "toto";
		 * @return : Validité booléenne
		 */
		public function isValid ():Boolean
		{
			return ((getDefinitionByName(getQualifiedClassName(this)) as Class)[_value.toUpperCase().replace(/ /, "_")] != null);
		}
		
		/**
		 * toString
		 * @return : la valeur au format string
		 */
		public function toString ():String
		{
			return _value;
		}
	}
}